﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Dominio.Repositorios;
using Dominio;
using WebUI.Models;

namespace WebUI.Controllers {
    public class CategoriaController : Controller{

        public ActionResult Index(Usuario usuario){
            var categorias = ObtemCategoria(usuario);

            ViewBag.Categorias = MapCategoriaItemModel(categorias);
            ViewBag.Subs = new SelectList(MapCategoriaItemModel(categorias.Where(x => x is Categoria).ToList()), "IdCategoria", "NomeCategoria");

            return PartialView();
        }

        [HttpPost]
        public ActionResult Index(CategoriaModel model, Usuario usuario) {
            if (!model.IdCategoriaMae.HasValue)
                usuario.NovaCategoria(model.NomeCategoria);
            else usuario.NovaCategoria(model.NomeCategoria, model.IdCategoriaMae.Value);

            return RedirectToAction("Index");
        }

        public ActionResult Categorias(Usuario usuario) {

            return PartialView("Categorias", MapCategoriaItemModel(ObtemCategoria(usuario)));
        }

        private List<CategoriaBase> ObtemCategoria(Usuario usuario) {
            var lista = new List<CategoriaBase>();
            foreach (var categoria in usuario.Categorias) {
                lista.Add(categoria);
                foreach (var sub in categoria.SubCategorias) {
                    lista.Add(sub);
                }
            }
            return lista;
        }

        private List<CategoriaItemModel> MapCategoriaItemModel(List<CategoriaBase> categorias) {
            return categorias
                          .Select(x => new CategoriaItemModel(x))
                          .OrderBy(x => x.NomeCategoria)
                          .ToList();
        }

        public ActionResult Apagar(long id, long? idCategoriaMae, Usuario usuario) {
            if (idCategoriaMae.HasValue)
                usuario.ApagaSubCategoria(id, idCategoriaMae.Value);
            else
                usuario.ApagaCategoria(id);

            return Json(true);
        }

        public ActionResult Alterar(long id, long? idCategoriaMae, Usuario usuario) {
            CategoriaBase categoria = null;
            if (idCategoriaMae == null)
                categoria = usuario.ObtemCategoria(id);
            else categoria = usuario.ObtemSubCategoria(id, idCategoriaMae.Value);

            return PartialView(new CategoriaEditModel(categoria));
        }
    }
}
